﻿using Dapper;
using System.Data;
using System.Data.SqlClient;
namespace Dapper333
{
    public class 参数
    {

        public 参数() { 
            
            /*
                参数：
                    1、匿名类型参数
                    2、动态类型参数
                    3、列表类型参数
                    4、字符串类型参数
             */


            /*
                1、匿名类型参数：
                        Dapper 通过支持匿名类型使其可以简单、安全(预防sql注入)的使用参数

             */
                
                       // eg: 单次执行存储过程
                            var sql = "EXEC Invoice_Insert";

                            using (var connection = new SqlConnection())
                            {
                                connection.Open();

                                var affectedRows = connection.Execute(sql,
                                                                      new { Kind = "WebInvoice", Code = "Single_Insert_1" },
                                                                      commandType: CommandType.StoredProcedure);
                            }

                      //eg:多次执行存储过程

                            var sql2 = "EXEC Invoice_Insert";
                            using (var connection1 = new SqlConnection())
                            {
                                connection1.Open();

                                var affectedRows = connection1.Execute(sql,
                                                                       new[] { 
                                                                            new {Kind = "WebInvoice",Code="Many_Insert_1" },
                                                                            new {Kind = "WebInvoice",Code="Many_Insert_2"},
                                                                            new {Kind = "WebInvoice",Code="Many_Insert_3"}
                                                                       },
                                                                       commandType:CommandType.StoredProcedure);
                            }


            /*
                2、动态类型参数
                        
                     在Dapper的方法中创建并使用参数。
             */

                        //eg: 单次执行Sql命令：
                                var sql3 = "EXEC Invoice_Insert";

                                using (var connection = new SqlConnection())
                                {
                                    connection.Open();

                                    DynamicParameters parameter =new DynamicParameters();

                                    parameter.Add("@Kind", "WebInvoice", DbType.Int32, ParameterDirection.Input);
                                    parameter.Add("@Code","Many_Insert_0",DbType.String,ParameterDirection.Input);
                                    parameter.Add("@RowCount",dbType:DbType.Int32,direction:ParameterDirection.ReturnValue);


                                    connection.Execute(sql,parameter,commandType:CommandType.StoredProcedure);

                                    int rowCount = parameter.Get<int>("@RowCount");
                                }

                                // eg:多次执行sql命令：
                                var sql4 = "EXEC Invoice_Insert";

                                var parameters = new List<DynamicParameters>();

                                for (var i = 0; i < 3; i++)
                                {
                                    var p = new DynamicParameters();
                                    p.Add("@Kind", 1, DbType.Int32, ParameterDirection.Input);
                                    p.Add("@Code", "Many_Insert_" + (i + 1), DbType.String, ParameterDirection.Input);
                                    p.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

                                    parameters.Add(p);
                                }
                                using (var connection = new SqlConnection())
                                {
                                    connection.Open();
                                    connection.Execute(sql,parameters,commandType:CommandType.StoredProcedure);
                                    var rowCount = parameters.Sum(x=>x.Get<int>("@RowCount"));
                                }
            /*
                3、列表参数类型
                    
                        Dapper允许您使用列表在In字句中指定多个参数
             */
               //eg: 在In 字句中使用列表参数
        }
    }
}
